Here we look at the “dualism” scale (Weisman; Packet 3) in detail.
Differences across fieldsites
Mean subscale scores by site
First, let’s take the 5 a priori subscales we posited and look at the average scores for participants in each site:

Some surprising things come out of this:
- US participants scored higher in “dualism”, on average, than other participants in nearly every subscale. This is the opposite of what we might predict.
- GH and VT participants - who were the most likely to be devout Christians, given our samples - scored quite low in “dualism” across the board, even in the more spiritual kinds of “dualism” that were captured by the “Life events” and “Minds, selves, & world” subscales.
Let’s look at these differences in more detail using the “raw data” for individual questions, rather than these subscale scores. (After all, these subscales have never been validated! This is one of the very first times we’ve tried this scale.)
Responses by question, by site
There are two ways we might want to look at the “raw data” here: after reverse-coding (which allows us to see how “dualist” vs. “materialist” participants’ responses were in each site) and before reverse-coding (which allows to to see how often people circled “I agree” vs. “I do not agree”). These are 100% redundant, but for some purposes one might be more intuitive than the other.
AFTER reverse-coding
First, let’s look at responses the way they were intended to be looked at - i.e., after reverse-coding items. Here, we focus on the percentage of people who gave the more “dualist” (i.e., less “materialist”) response to each question:
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

BEFORE reverse-coding
Now, let’s look at responses the way the participants saw them - i.e., before reverse-coding items. Here, we focus on the percentage of people who circled “I agree” for each question:
attributes are not identical across measure variables;
they will be droppedJoining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Either way we look at it, a few weird things jump out. Just to highlight a few that John and I noticed:
- Only 75% of GH participants circled “I agree” to the item “I believe in something like a soul or a spirit” (in the “Minds, selves, & world” subscale). This is lower than the US!
- 56% of GH participants circled “I agree” to the item “Even though some people believe in souls or spirits, there is really no such thing” (also in the “Minds, selves, & world” subscale). This seems really off, and it’s very inconsistent with the “I believe in something like a soul or a spirit” item, above.
- 55% of GH participants and 43% of VT participants cirlced “I agree” to the item “There is no such thing as an afterlife” (in the “Live events” subscale). This is lower than I’d predict among devout Christians.
Many of these questions seem to have been particularly problematic in Ghana, though it could be useful to get other perspectives on the responses from each site.
Scale structure
Another kind of question you could ask is how the different questions were correlated with each other, both overall and within each site.
Overall
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

By site
US alone
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Ghana alone
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Thailand alone
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Vanuatu alone
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

LS0tCnRpdGxlOiAnR3JhcHBsaW5nIHdpdGggdGhlICJEdWFsaXNtIiBzY2FsZScKc3VidGl0bGU6ICdMYXN0IHVwZGF0ZWQgMjAxOC0wNC0wNycKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CiMgc2V0IHdvcmtpbmcgZGlyZWN0b3IKIyBzZXR3ZCgiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy90ZW1wbGV0b25fcGFja2V0cy9wYWNrZXRzMTIzLyIpCgojIGxvYWQgcGFja2FnZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocm1zKQpsaWJyYXJ5KGdnZGVuZHJvKQpsaWJyYXJ5KHBzeWNoKQoKIyBsb2FkIHF1ZXN0aW9uIGtleSAoaW5jbHVkaW5nIG1hbnVhbCByZXZlcnNlLWNvZGluZykKcXVlc3Rpb25fa2V5IDwtIHJlYWQuY3N2KCIvL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy90ZW1wbGV0b25fcGFja2V0cy9wYWNrZXRzMTIzL3BhY2tldHMxMjNfcXVlc3Rpb25fa2V5X2J5aGFuZC5jc3YiKQoKIyBsb2FkIGRhdGEgKHJldmVyc2UtY29kZWQpCmRfbG9uZyA8LSByZWFkX2NzdigiLy9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREFUQSBXUkFOR0xJTkcvdGVtcGxldG9uX3BhY2tldHMvcGFja2V0czEyMy9wYWNrZXRzMTIzX2RhdGFfYnlxdWVzdGlvbl9sb25nLmNzdiIpICU+JQogIG11dGF0ZShjdHJ5ID0gZmFjdG9yKGN0cnksIAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoYW5hIiwgInRoYWlsYW5kIiwgImNoaW5hIiwgInZhbnVhdHUiKSkpCmRfbG9uZ19zdWJzY2FsZSA8LSByZWFkX2NzdigiLy9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREFUQSBXUkFOR0xJTkcvdGVtcGxldG9uX3BhY2tldHMvcGFja2V0czEyMy9wYWNrZXRzMTIzX2RhdGFfYnlzdWJzY2FsZV9sb25nLmNzdiIpICU+JQogIG11dGF0ZShjdHJ5ID0gZmFjdG9yKGN0cnksIAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoYW5hIiwgInRoYWlsYW5kIiwgImNoaW5hIiwgInZhbnVhdHUiKSkpCgojIGxvYWQgZGF0YSAoYmVmb3JlIHJldmVyc2UtY29kaW5nKQpkX2FsbCA8LSByZWFkLmNzdigiLy9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREFUQSBXUkFOR0xJTkcvdGVtcGxldG9uX3BhY2tldHMvcGFja2V0czEyMy9wYWNrZXRzMTIzX2RhdGEuY3N2IikKCiMgbWFrZSBjdXN0b20gZnVuY3Rpb25zCnJvdW5kMiA8LSBmdW5jdGlvbih4KSB7Zm9ybWF0KHJvdW5kKHgsIDIpLCBkaWdpdHMgPSAyKX0KYGBgCgpIZXJlIHdlIGxvb2sgYXQgdGhlICJkdWFsaXNtIiBzY2FsZSAoV2Vpc21hbjsgUGFja2V0IDMpIGluIGRldGFpbC4KCiMgRGlmZmVyZW5jZXMgYWNyb3NzIGZpZWxkc2l0ZXMKCiMjIE1lYW4gc3Vic2NhbGUgc2NvcmVzIGJ5IHNpdGUKCkZpcnN0LCBsZXQncyB0YWtlIHRoZSA1IGEgcHJpb3JpIHN1YnNjYWxlcyB3ZSBwb3NpdGVkIGFuZCBsb29rIGF0IHRoZSBhdmVyYWdlIHNjb3JlcyBmb3IgcGFydGljaXBhbnRzIGluIGVhY2ggc2l0ZToKCmBgYHtyLCBpbmNsdWRlID0gRn0KZF9sb25nX3N1YnNjYWxlX2Jvb3QgPC0gZF9sb25nX3N1YnNjYWxlICU+JQogIGZpbHRlcighaXMubmEoc3VtX3Njb3JlKSkgJT4lCiAgZ3JvdXBfYnkoY3RyeSwgcGFja2V0LCBzdWJzY2FsZSkgJT4lCiAgZG8oZGF0YS5mcmFtZShyYmluZChzbWVhbi5jbC5ib290KC4kc3VtX3Njb3JlKSkpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKHN1YnNjYWxlICE9ICJhdHRuIikgJT4lCiAgbGVmdF9qb2luKGRfbG9uZ19zdWJzY2FsZSAlPiUKICAgICAgICAgICAgICBmaWx0ZXIoIWlzLm5hKHN1bV9zY29yZSkpICU+JQogICAgICAgICAgICAgIGNvdW50KGN0cnksIHBhY2tldCwgc3Vic2NhbGUpKSAlPiUKICBtdXRhdGUocGFja2V0ID0gcGFzdGUoInBhY2tldCIsIHBhY2tldCksCiAgICAgICAgIGN0cnkgPSBmYWN0b3IoY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaGFuYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoYWlsYW5kIiwgImNoaW5hIiwgInZhbnVhdHUiKSksCiAgICAgICAgIHN1YnNjYWxlID0gCiAgICAgICAgICAgZmFjdG9yKHN1YnNjYWxlLAogICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJleHdsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4d2xfZXh0cmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc2VfMDF0bzE0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzZV8xNXRvMTYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BldiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5fc2Vuc29yeV9zZWVraW5nIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbl9ib2R5X2F3YXJlbmVzcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5fdHJhaXRfbWV0YW1vb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZXIyX2hhbGx1Y2luYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZvX1ZJU1FfZGlhbG9naWNfc3BlZWNoIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludm9fVklTUV9pbm5lcl9zcGVlY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZvX1ZJU1FfZXZhbF9tb3Rpdl9pbm5lcl9zcGVlY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZvX2hhcmR5X2JlbnRhbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZXJfcG9zZXlfbG9zY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvX2xld2lja2kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhX3Zhbl9lbGsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXRfY29uZmlkZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhdF9wb3NpdGl2ZV9iZWxpZWZzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGF0X2NvZ25pdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhdF91bmNvbnRyb2xsYWJpbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhdF9uZWVkX2NvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW53X21lbnRhbF9zdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW53X2xpZmVfZXZlbnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlud19pbmFuaW1hdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW53X3NlbHZlc19zb3Vsc193b3JsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbndfZXBpc3RlbWljIiksCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFic29ycHRpb24gKHRlbGxlZ2VuKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYnNvcnB0aW9uIChleHRyYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYWlseSBzcGlyaXR1YWwgZXhwZXJpZW5jZXMgKCMxLTE0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhaWx5IHNwaXJpdHVhbCBleHBlcmllbmNlcyAoIzE1LTE2KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwaXJpdHVhbCBldmVudHMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc29yeSBzZWVraW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9keSBhd2FyZW5lc3MiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW50aW9uIHRvIGZlZWxpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFsbHVjaW5hdGlvbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWSVNROiBkaWFsb2dpYyBzcGVlY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWSVNROiBpbm5lciBzcGVlY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWSVNROiBldmFsdWF0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5uZXIgc3BlZWNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhcmluZyBldmVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGluZyBzdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmQgbWV0YXBob3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0YWNvZy46IGxhY2sgb2YgY29nbml0aXZlIGNvbmZpZGVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhY29nLjogcG9zaXRpdmUgYmVsaWVmcyByZTogd29ycnlpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhY29nLjogY29nbml0aXZlIHNlbGYtY29uc2Npb3VzbmVzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFjb2cuOiB1bmNvbnRyb2xsYWJpbGl0eS9kYW5nZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhY29nLjogbmVlZCB0byBjb250cm9sIHRob3VnaHRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVhbGlzbTogbWVudGFsIHN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1YWxpc206IGxpZmUgZXZlbnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVhbGlzbTogaW5hbmltYXRlIGNvbnNjaW91c25lc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdWFsaXNtOiBtaW5kcywgc2VsdmVzLCAmIHdvcmxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVhbGlzbTogZXBpc3RlbW9sb2d5IikpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC42fQpnZ3Bsb3QoZF9sb25nX3N1YnNjYWxlX2Jvb3QgJT4lCiAgICAgICAgIGZpbHRlcihncmVwbCgiZHVhbGlzbSIsIHN1YnNjYWxlKSkgJT4lCiAgICAgICAgIG11dGF0ZShzdWJzY2FsZSA9IAogICAgICAgICAgICAgICAgICBmYWN0b3Ioc3Vic2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiRHVhbGlzbTogTWVudGFsIHN0YXRlc1xucmFuZ2U6IDAgdG8gOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1YWxpc206IExpZmUgZXZlbnRzXG5yYW5nZTogMCB0byA1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVhbGlzbTogSW5hbmltYXRlIGNvbnNjaW91c25lc3NcbnJhbmdlOiAwIHRvIDYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdWFsaXNtOiBNaW5kcywgc2VsdmVzLCAmIHdvcmxkXG5yYW5nZTogMCB0byA5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVhbGlzbTogRXBpc3RlbW9sb2d5XG5yYW5nZTogMCB0byA1IikpKSAlPiUKICAgICAgICAgbXV0YXRlKHBhY2tldCA9IGdzdWIoInBhY2tldCAiLCAiUCIsIHBhY2tldCksCiAgICAgICAgICAgICAgICBtYXggPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgIGdyZXBsKCJtZW50YWwgc3RhdGVzIiwgdG9sb3dlcihzdWJzY2FsZSkpIH4gOCwKICAgICAgICAgICAgICAgICAgZ3JlcGwoImxpZmUgZXZlbnRzIiwgdG9sb3dlcihzdWJzY2FsZSkpIH4gNSwKICAgICAgICAgICAgICAgICAgZ3JlcGwoImluYW5pbWF0ZSIsIHRvbG93ZXIoc3Vic2NhbGUpKSB+IDYsCiAgICAgICAgICAgICAgICAgIGdyZXBsKCJtaW5kcyIsIHRvbG93ZXIoc3Vic2NhbGUpKSB+IDksCiAgICAgICAgICAgICAgICAgIGdyZXBsKCJlcGlzdGVtIiwgdG9sb3dlcihzdWJzY2FsZSkpIH4gNSkpLAogICAgICAgYWVzKHggPSBjdHJ5LCB5ID0gTWVhbiwgY29sb3IgPSBjdHJ5KSkgKwogIGZhY2V0X3dyYXAofiByZW9yZGVyKGludGVyYWN0aW9uKHBhY2tldCwgc3Vic2NhbGUsIHNlcCA9ICI6ICIpLAogICAgICAgICAgICAgICAgICAgICAgIGFzLm51bWVyaWMoZmFjdG9yKHBhY2tldCkpKSwKICAgICAgICAgICAgIG5jb2wgPSA1LCBzY2FsZXMgPSAiZml4ZWQiKSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IDApLCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWF4KSwgbHR5ID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlcikpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpLCB5ID0gTG93ZXIpLCAKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3ggPSAwLjE1LCBoanVzdCA9IDApICsKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA5KSwgYnJlYWtzID0gMDo5KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSAiTWVhbiBzdWJzY2FsZSBzY29yZXMgYnkgc2l0ZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJBIGhpZ2hlciBzY29yZSBpbmRpY2F0ZXMgbW9yZSAnZHVhbGlzdCcgcmF0aGVyIHRoYW4gJ21hdGVyaWFsaXN0JyByZXBvbnNlc1xuTWluLiBhbmQgbWF4LiBzY29yZSBmb3IgZWFjaCBzdWJzY2FsZSBhcmUgZGVtYXJjYXRlZCBieSB0aGUgZG90dGVkIGxpbmVzXG5FcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIiwKICAgICAgIHggPSAiU2l0ZSIsIGNvbG9yID0gIlNpdGUiLAogICAgICAgeSA9ICJNZWFuIHN1YnNjYWxlIHNjb3JlIChyYW5nZSB2YXJpZXMgYnkgc3Vic2NhbGUpIikKYGBgCgpTb21lIHN1cnByaXNpbmcgdGhpbmdzIGNvbWUgb3V0IG9mIHRoaXM6CgotIFVTIHBhcnRpY2lwYW50cyBzY29yZWQgaGlnaGVyIGluICJkdWFsaXNtIiwgb24gYXZlcmFnZSwgdGhhbiBvdGhlciBwYXJ0aWNpcGFudHMgaW4gbmVhcmx5IGV2ZXJ5IHN1YnNjYWxlLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IHdlIG1pZ2h0IHByZWRpY3QuCi0gR0ggYW5kIFZUIHBhcnRpY2lwYW50cyAtIHdobyB3ZXJlIHRoZSBtb3N0IGxpa2VseSB0byBiZSBkZXZvdXQgQ2hyaXN0aWFucywgZ2l2ZW4gb3VyIHNhbXBsZXMgLSBzY29yZWQgcXVpdGUgbG93IGluICJkdWFsaXNtIiBhY3Jvc3MgdGhlIGJvYXJkLCBldmVuIGluIHRoZSBtb3JlIHNwaXJpdHVhbCBraW5kcyBvZiAiZHVhbGlzbSIgdGhhdCB3ZXJlIGNhcHR1cmVkIGJ5IHRoZSAiTGlmZSBldmVudHMiIGFuZCAiTWluZHMsIHNlbHZlcywgJiB3b3JsZCIgc3Vic2NhbGVzLgoKTGV0J3MgbG9vayBhdCB0aGVzZSBkaWZmZXJlbmNlcyBpbiBtb3JlIGRldGFpbCB1c2luZyB0aGUgInJhdyBkYXRhIiBmb3IgaW5kaXZpZHVhbCBxdWVzdGlvbnMsIHJhdGhlciB0aGFuIHRoZXNlIHN1YnNjYWxlIHNjb3Jlcy4gKEFmdGVyIGFsbCwgdGhlc2Ugc3Vic2NhbGVzIGhhdmUgbmV2ZXIgYmVlbiB2YWxpZGF0ZWQhIFRoaXMgaXMgb25lIG9mIHRoZSB2ZXJ5IGZpcnN0IHRpbWVzIHdlJ3ZlIHRyaWVkIHRoaXMgc2NhbGUuKQoKIyMgUmVzcG9uc2VzIGJ5IHF1ZXN0aW9uLCBieSBzaXRlCgpUaGVyZSBhcmUgdHdvIHdheXMgd2UgbWlnaHQgd2FudCB0byBsb29rIGF0IHRoZSAicmF3IGRhdGEiIGhlcmU6IGFmdGVyIHJldmVyc2UtY29kaW5nICh3aGljaCBhbGxvd3MgdXMgdG8gc2VlIGhvdyAiZHVhbGlzdCIgdnMuICJtYXRlcmlhbGlzdCIgcGFydGljaXBhbnRzJyByZXNwb25zZXMgd2VyZSBpbiBlYWNoIHNpdGUpIGFuZCBiZWZvcmUgcmV2ZXJzZS1jb2RpbmcgKHdoaWNoIGFsbG93cyB0byB0byBzZWUgaG93IG9mdGVuIHBlb3BsZSBjaXJjbGVkICJJIGFncmVlIiB2cy4gIkkgZG8gbm90IGFncmVlIikuIFRoZXNlIGFyZSAxMDAlIHJlZHVuZGFudCwgYnV0IGZvciBzb21lIHB1cnBvc2VzIG9uZSBtaWdodCBiZSBtb3JlIGludHVpdGl2ZSB0aGFuIHRoZSBvdGhlci4KCiMjIyBBRlRFUiByZXZlcnNlLWNvZGluZwoKRmlyc3QsIGxldCdzIGxvb2sgYXQgcmVzcG9uc2VzIHRoZSB3YXkgdGhleSB3ZXJlIGludGVuZGVkIHRvIGJlIGxvb2tlZCBhdCAtIGkuZS4sICoqYWZ0ZXIqKiByZXZlcnNlLWNvZGluZyBpdGVtcy4gSGVyZSwgd2UgZm9jdXMgb24gdGhlIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdobyBnYXZlIHRoZSBtb3JlICJkdWFsaXN0IiAoaS5lLiwgbGVzcyAibWF0ZXJpYWxpc3QiKSByZXNwb25zZSB0byBlYWNoIHF1ZXN0aW9uOgoKYGBge3IsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAwLjZ9CmRfbG9uZyAlPiUKICBmaWx0ZXIoZ3JlcGwoIm1pbndfIiwgcXVlc3Rpb24pLAogICAgICAgICAjIGN0cnkgJWluJSBjKCJnaGFuYSIsICJ1cyIpLAogICAgICAgICAhZ3JlcGwoImF0dG4iLCBxdWVzdGlvbiksCiAgICAgICAgICFpcy5uYShyZXNwb25zZSkpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lCiAgICAgICAgICAgICAgZGlzdGluY3QocXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsLCAKICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl90ZXh0LAogICAgICAgICAgICAgICAgICAgICAgIGJ5aGFuZF9jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgYnloYW5kX3N1YnNjYWxlKSAlPiUKICAgICAgICAgICAgICByZW5hbWUocXVlc3Rpb24gPSBxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwsCiAgICAgICAgICAgICAgICAgICAgIGNvZGluZyA9IGJ5aGFuZF9jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgIHN1YnNjYWxlID0gYnloYW5kX3N1YnNjYWxlKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUocmVzcG9uc2UgPSBmYWN0b3IocmVzcG9uc2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDAsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCInTWF0ZXJpYWxpc3QnIiwgIidEdWFsaXN0JyIpKSwKICAgICAgICAgY29kaW5nID0gZmFjdG9yKGNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIi0xIiwgIjEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIihSRVZFUlNFRCkiLCAiIikpLAogICAgICAgICBxdWVzdGlvbl90ZXh0X3Nob3J0ID0gcGFzdGUwKHN1YnN0cihxdWVzdGlvbl90ZXh0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAxLCBzdG9wID0gMTAwMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIi4uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nKSwKICAgICAgICAgc3Vic2NhbGUgPSBmYWN0b3Ioc3Vic2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkVwaXN0ZW1vbG9neSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluYW5pbWF0ZSBiZWluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaWZlIGV2ZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lbnRhbCBzdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaW5kcywgc2VsdmVzLCAmIHdvcmxkIikpKSAlPiUKICBjb3VudChjdHJ5LCBzdWJzY2FsZSwgcXVlc3Rpb25fdGV4dF9zaG9ydCwgcmVzcG9uc2UpICU+JQogIHNwcmVhZChyZXNwb25zZSwgbikgJT4lCiAgYXJyYW5nZShzdWJzY2FsZSwgY3RyeSwgZGVzYyhgJ0R1YWxpc3QnYCkpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigib3JkZXIiKSAlPiUKICBtdXRhdGUob3JkZXIgPSBhcy5udW1lcmljKG9yZGVyKSwKICAgICAgICAgdG90YWxfbiA9IGAnTWF0ZXJpYWxpc3QnYCArIGAnRHVhbGlzdCdgKSAlPiUKICBnYXRoZXIocmVzcG9uc2UsIG4sIGMoYCdNYXRlcmlhbGlzdCdgLCBgJ0R1YWxpc3QnYCkpICU+JQogIG11dGF0ZShyZXNwb25zZSA9IGZhY3RvcihyZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiJ01hdGVyaWFsaXN0JyIsICInRHVhbGlzdCciKSksCiAgICAgICAgIGN0cnkgPSBmYWN0b3IoY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaGFuYSIsICJ0aGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaW5hIiwgInZhbnVhdHUiKSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0X3Nob3J0LCBkZXNjKG9yZGVyKSksIAogICAgICAgICAgICAgeSA9IG4sIGZpbGwgPSByZXNwb25zZSkpICsKICBmYWNldF9ncmlkKHN1YnNjYWxlIH4gY3RyeSwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2soKSwgc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKG4vdG90YWxfbiwgMikqMTAwLCAiJSIpLCAKICAgICAgICAgICAgICAgIGFscGhhID0gcmVzcG9uc2UpLCBzaXplID0gMykgKwogIHNjYWxlX2FscGhhX2Rpc2NyZXRlKGd1aWRlID0gIm5vbmUiLCByYW5nZSA9IGMoMCwgMSkpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIlJlc3BvbnNlcyB0byAnRHVhbGlzbScgc2NhbGUgaXRlbXMiLAogICAgICAgc3VidGl0bGUgPSAiJSBjb3JyZXNwb25kcyB0byB0aG9zZSBnaXZpbmcgdGhlIG1vcmUgJ2R1YWxpc3QnIHJlc3BvbnNlLCBhZnRlciByZXZlcnNlIGNvZGluZyAodHVycXVvaXNlKSIsCiAgICAgICB4ID0gIiIsIHkgPSAiQ291bnQgb2YgcmVzcG9uc2VzIiwgZmlsbCA9ICJUeXBlIG9mIHJlc3BvbnNlIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgIyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQogIGNvb3JkX2ZsaXAoKQpgYGAKCgojIyBCRUZPUkUgcmV2ZXJzZS1jb2RpbmcKCk5vdywgbGV0J3MgbG9vayBhdCByZXNwb25zZXMgdGhlIHdheSB0aGUgcGFydGljaXBhbnRzIHNhdyB0aGVtIC0gaS5lLiwgKipiZWZvcmUqKiByZXZlcnNlLWNvZGluZyBpdGVtcy4gSGVyZSwgd2UgZm9jdXMgb24gdGhlIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdobyBjaXJjbGVkICJJIGFncmVlIiBmb3IgZWFjaCBxdWVzdGlvbjoKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMC42fQpkX2FsbCAlPiUKICBzZWxlY3Qoc3ViaiwgY3RyeSwgc3RhcnRzX3dpdGgoIm1pbndfIikpICU+JQogIGdhdGhlcihxdWVzdGlvbiwgcmVzcG9uc2UsIHN0YXJ0c193aXRoKCJtaW53XyIpKSAlPiUKICBmaWx0ZXIoZ3JlcGwoIm1pbndfIiwgcXVlc3Rpb24pLAogICAgICAgICAjIGN0cnkgJWluJSBjKCJnaGFuYSIsICJ1cyIpLAogICAgICAgICAhZ3JlcGwoImF0dG4iLCBxdWVzdGlvbiksCiAgICAgICAgICFpcy5uYShyZXNwb25zZSkpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lCiAgICAgICAgICAgICAgZGlzdGluY3QocXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsLCAKICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl90ZXh0LAogICAgICAgICAgICAgICAgICAgICAgIGJ5aGFuZF9jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgYnloYW5kX3N1YnNjYWxlKSAlPiUKICAgICAgICAgICAgICByZW5hbWUocXVlc3Rpb24gPSBxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwsCiAgICAgICAgICAgICAgICAgICAgIGNvZGluZyA9IGJ5aGFuZF9jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgIHN1YnNjYWxlID0gYnloYW5kX3N1YnNjYWxlKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUoIyByZXNwb25zZSA9IGZhY3RvcihyZXNwb25zZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWxzID0gYygwLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsYWJlbHMgPSBjKCInTWF0ZXJpYWxpc3QnIiwgIidEdWFsaXN0JyIpKSwKICAgICAgICAgY29kaW5nID0gZmFjdG9yKGNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIi0xIiwgIjEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIihSRVZFUlNFRCkiLCAiIikpLAogICAgICAgICBxdWVzdGlvbl90ZXh0X3Nob3J0ID0gcGFzdGUwKHN1YnN0cihxdWVzdGlvbl90ZXh0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAxLCBzdG9wID0gMTAwMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIi4uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nKSwKICAgICAgICAgc3Vic2NhbGUgPSBmYWN0b3Ioc3Vic2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkVwaXN0ZW1vbG9neSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluYW5pbWF0ZSBiZWluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaWZlIGV2ZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lbnRhbCBzdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaW5kcywgc2VsdmVzLCAmIHdvcmxkIikpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHN1YnNjYWxlKSkgJT4lCiAgY291bnQoY3RyeSwgc3Vic2NhbGUsIGNvZGluZywgcXVlc3Rpb25fdGV4dF9zaG9ydCwgcmVzcG9uc2UpICU+JQogIHNwcmVhZChyZXNwb25zZSwgbikgJT4lCiAgYXJyYW5nZShzdWJzY2FsZSwgY3RyeSwgZGVzYyhgaSBhZ3JlZWApKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oIm9yZGVyIikgJT4lCiAgbXV0YXRlKG9yZGVyID0gYXMubnVtZXJpYyhvcmRlciksCiAgICAgICAgIHRvdGFsX24gPSBgaSBkbyBub3QgYWdyZWVgICsgYGkgYWdyZWVgKSAlPiUKICBnYXRoZXIocmVzcG9uc2UsIG4sIGMoYGkgZG8gbm90IGFncmVlYCwgYGkgYWdyZWVgKSkgJT4lCiAgbXV0YXRlKHJlc3BvbnNlID0gZmFjdG9yKHJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJpIGRvIG5vdCBhZ3JlZSIsICJpIGFncmVlIikpLAogICAgICAgICBjdHJ5ID0gZmFjdG9yKGN0cnksCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAidGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGluYSIsICJ2YW51YXR1IiksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpLAogICAgICAgICBjb2RpbmcgPSBmYWN0b3IoY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiIiwgIihSRVZFUlNFRCkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIm5vcm1hbCIsICJyZXZlcnNlZCIpKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShzdWJzY2FsZSkpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0X3Nob3J0LCBkZXNjKG9yZGVyKSksIAogICAgICAgICAgICAgeSA9IG4sIGZpbGwgPSBjb2RpbmcsIGFscGhhID0gcmVzcG9uc2UpKSArCiAgZmFjZXRfZ3JpZChzdWJzY2FsZSB+IGN0cnksIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKCksIHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChuL3RvdGFsX24sIDIpKjEwMCwgIiUiKSwgCiAgICAgICAgICAgICAgICBhbHBoYSA9IHJlc3BvbnNlKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9hbHBoYV9kaXNjcmV0ZShndWlkZSA9ICJub25lIiwgcmFuZ2UgPSBjKDAsIDEpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiUmVzcG9uc2VzIHRvICdEdWFsaXNtJyBzY2FsZSBpdGVtcyIsCiAgICAgICBzdWJ0aXRsZSA9ICIlIGNvcnJlc3BvbmRzIHRvIHRob3NlIHdobyBzYXkgJ0kgYWdyZWUsJyBCRUZPUkUgcmV2ZXJzZS1jb2RpbmciLAogICAgICAgeCA9ICIiLCB5ID0gIkNvdW50IG9mIHJlc3BvbnNlcyIsIGZpbGwgPSAiVHlwZSBvZiBxdWVzdGlvbiIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogICMgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKICBjb29yZF9mbGlwKCkKYGBgCgpFaXRoZXIgd2F5IHdlIGxvb2sgYXQgaXQsIGEgZmV3IHdlaXJkIHRoaW5ncyBqdW1wIG91dC4gSnVzdCB0byBoaWdobGlnaHQgYSBmZXcgdGhhdCBKb2huIGFuZCBJIG5vdGljZWQ6CgotIE9ubHkgNzUlIG9mIEdIIHBhcnRpY2lwYW50cyBjaXJjbGVkICJJIGFncmVlIiB0byB0aGUgaXRlbSAiSSBiZWxpZXZlIGluIHNvbWV0aGluZyBsaWtlIGEgc291bCBvciBhIHNwaXJpdCIgKGluIHRoZSAiTWluZHMsIHNlbHZlcywgJiB3b3JsZCIgc3Vic2NhbGUpLiBUaGlzIGlzIGxvd2VyIHRoYW4gdGhlIFVTIQotIDU2JSBvZiBHSCBwYXJ0aWNpcGFudHMgY2lyY2xlZCAiSSBhZ3JlZSIgdG8gdGhlIGl0ZW0gIkV2ZW4gdGhvdWdoIHNvbWUgcGVvcGxlIGJlbGlldmUgaW4gc291bHMgb3Igc3Bpcml0cywgdGhlcmUgaXMgcmVhbGx5IG5vIHN1Y2ggdGhpbmciIChhbHNvIGluIHRoZSAiTWluZHMsIHNlbHZlcywgJiB3b3JsZCIgc3Vic2NhbGUpLiBUaGlzIHNlZW1zIHJlYWxseSBvZmYsIGFuZCBpdCdzIHZlcnkgaW5jb25zaXN0ZW50IHdpdGggdGhlICJJIGJlbGlldmUgaW4gc29tZXRoaW5nIGxpa2UgYSBzb3VsIG9yIGEgc3Bpcml0IiBpdGVtLCBhYm92ZS4KLSA1NSUgb2YgR0ggcGFydGljaXBhbnRzIGFuZCA0MyUgb2YgVlQgcGFydGljaXBhbnRzIGNpcmxjZWQgIkkgYWdyZWUiIHRvIHRoZSBpdGVtICJUaGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGFuIGFmdGVybGlmZSIgKGluIHRoZSAiTGl2ZSBldmVudHMiIHN1YnNjYWxlKS4gVGhpcyBpcyBsb3dlciB0aGFuIEknZCBwcmVkaWN0IGFtb25nIGRldm91dCBDaHJpc3RpYW5zLgoKTWFueSBvZiB0aGVzZSBxdWVzdGlvbnMgc2VlbSB0byBoYXZlIGJlZW4gcGFydGljdWxhcmx5IHByb2JsZW1hdGljIGluIEdoYW5hLCB0aG91Z2ggaXQgY291bGQgYmUgdXNlZnVsIHRvIGdldCBvdGhlciBwZXJzcGVjdGl2ZXMgb24gdGhlIHJlc3BvbnNlcyBmcm9tIGVhY2ggc2l0ZS4KCiMgU2NhbGUgc3RydWN0dXJlCgpBbm90aGVyIGtpbmQgb2YgcXVlc3Rpb24geW91IGNvdWxkIGFzayBpcyBob3cgdGhlIGRpZmZlcmVudCBxdWVzdGlvbnMgd2VyZSBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlciwgYm90aCBvdmVyYWxsIGFuZCB3aXRoaW4gZWFjaCBzaXRlLgoKIyMgT3ZlcmFsbAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQpvdmVyYWxsIDwtIGRfbG9uZyAlPiUKICBmaWx0ZXIoZ3JlcGwoIm1pbndfIiwgcXVlc3Rpb24pLCAhZ3JlcGwoImF0dG4iLCBxdWVzdGlvbiksIAogICAgICAgICAhaXMubmEocmVzcG9uc2UpKSAlPiUKICBzZWxlY3Qoc3ViaiwgcXVlc3Rpb24sIHJlc3BvbnNlKSAlPiUKICBsZWZ0X2pvaW4ocXVlc3Rpb25fa2V5ICU+JSAKICAgICAgICAgICAgICBzZWxlY3QocXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsLCAKICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25fdGV4dCwgYnloYW5kX3N1YnNjYWxlKSAlPiUgCiAgICAgICAgICAgICAgcmVuYW1lKHF1ZXN0aW9uID0gcXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsKSkgJT4lCiAgZGlzdGluY3Qoc3ViaiwgcXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIHNwcmVhZChxdWVzdGlvbl90ZXh0LCByZXNwb25zZSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJlbW92ZV9yb3duYW1lcygpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaiIpCgpvdmVyYWxsX2NsdXN0IDwtIGhjbHVzdChkaXN0KHQob3ZlcmFsbCkpKQpnZ2RlbmRyb2dyYW0ob3ZlcmFsbF9jbHVzdCwgcm90YXRlID0gVFJVRSkKYGBgCgojIyBCeSBzaXRlCgojIyMgVVMgYWxvbmUKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMX0KdXMgPC0gZF9sb25nICU+JQogIGZpbHRlcihncmVwbCgibWlud18iLCBxdWVzdGlvbiksICFncmVwbCgiYXR0biIsIHF1ZXN0aW9uKSwgCiAgICAgICAgICFpcy5uYShyZXNwb25zZSksIGN0cnkgPT0gInVzIikgJT4lCiAgc2VsZWN0KHN1YmosIHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgbGVmdF9qb2luKHF1ZXN0aW9uX2tleSAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCwgCiAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uX3RleHQsIGJ5aGFuZF9zdWJzY2FsZSkgJT4lIAogICAgICAgICAgICAgIHJlbmFtZShxdWVzdGlvbiA9IHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCkpICU+JQogIGRpc3RpbmN0KHN1YmosIHF1ZXN0aW9uX3RleHQsIHJlc3BvbnNlKSAlPiUKICBzcHJlYWQocXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmoiKQoKdXNfY2x1c3QgPC0gaGNsdXN0KGRpc3QodCh1cykpKQpnZ2RlbmRyb2dyYW0odXNfY2x1c3QsIHJvdGF0ZSA9IFRSVUUpCmBgYAoKIyMjIEdoYW5hIGFsb25lCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDF9CmdoYW5hIDwtIGRfbG9uZyAlPiUKICBmaWx0ZXIoZ3JlcGwoIm1pbndfIiwgcXVlc3Rpb24pLCAhZ3JlcGwoImF0dG4iLCBxdWVzdGlvbiksIAogICAgICAgICAhaXMubmEocmVzcG9uc2UpLCBjdHJ5ID09ICJnaGFuYSIpICU+JQogIHNlbGVjdChzdWJqLCBxdWVzdGlvbiwgcmVzcG9uc2UpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwsIAogICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl90ZXh0LCBieWhhbmRfc3Vic2NhbGUpICU+JSAKICAgICAgICAgICAgICByZW5hbWUocXVlc3Rpb24gPSBxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwpKSAlPiUKICBkaXN0aW5jdChzdWJqLCBxdWVzdGlvbl90ZXh0LCByZXNwb25zZSkgJT4lCiAgc3ByZWFkKHF1ZXN0aW9uX3RleHQsIHJlc3BvbnNlKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJqIikKCmdoYW5hX2NsdXN0IDwtIGhjbHVzdChkaXN0KHQoZ2hhbmEpKSkKZ2dkZW5kcm9ncmFtKGdoYW5hX2NsdXN0LCByb3RhdGUgPSBUUlVFKQpgYGAKCgoKCiMjIyBUaGFpbGFuZCBhbG9uZQoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQp0aGFpbGFuZCA8LSBkX2xvbmcgJT4lCiAgZmlsdGVyKGdyZXBsKCJtaW53XyIsIHF1ZXN0aW9uKSwgIWdyZXBsKCJhdHRuIiwgcXVlc3Rpb24pLCAKICAgICAgICAgIWlzLm5hKHJlc3BvbnNlKSwgY3RyeSA9PSAidGhhaWxhbmQiKSAlPiUKICBzZWxlY3Qoc3ViaiwgcXVlc3Rpb24sIHJlc3BvbnNlKSAlPiUKICBsZWZ0X2pvaW4ocXVlc3Rpb25fa2V5ICU+JSAKICAgICAgICAgICAgICBzZWxlY3QocXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsLCAKICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25fdGV4dCwgYnloYW5kX3N1YnNjYWxlKSAlPiUgCiAgICAgICAgICAgICAgcmVuYW1lKHF1ZXN0aW9uID0gcXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsKSkgJT4lCiAgZGlzdGluY3Qoc3ViaiwgcXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIHNwcmVhZChxdWVzdGlvbl90ZXh0LCByZXNwb25zZSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJlbW92ZV9yb3duYW1lcygpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaiIpCgp0aGFpbGFuZF9jbHVzdCA8LSBoY2x1c3QoZGlzdCh0KHRoYWlsYW5kKSkpCmdnZGVuZHJvZ3JhbSh0aGFpbGFuZF9jbHVzdCwgcm90YXRlID0gVFJVRSkKYGBgCgojIyMgVmFudWF0dSBhbG9uZQoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQp2YW51YXR1IDwtIGRfbG9uZyAlPiUKICBmaWx0ZXIoZ3JlcGwoIm1pbndfIiwgcXVlc3Rpb24pLCAhZ3JlcGwoImF0dG4iLCBxdWVzdGlvbiksIAogICAgICAgICAhaXMubmEocmVzcG9uc2UpLCBjdHJ5ID09ICJ2YW51YXR1IikgJT4lCiAgc2VsZWN0KHN1YmosIHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgbGVmdF9qb2luKHF1ZXN0aW9uX2tleSAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCwgCiAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uX3RleHQsIGJ5aGFuZF9zdWJzY2FsZSkgJT4lIAogICAgICAgICAgICAgIHJlbmFtZShxdWVzdGlvbiA9IHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCkpICU+JQogIGRpc3RpbmN0KHN1YmosIHF1ZXN0aW9uX3RleHQsIHJlc3BvbnNlKSAlPiUKICBzcHJlYWQocXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmoiKQoKdmFudWF0dV9jbHVzdCA8LSBoY2x1c3QoZGlzdCh0KHZhbnVhdHUpKSkKZ2dkZW5kcm9ncmFtKHZhbnVhdHVfY2x1c3QsIHJvdGF0ZSA9IFRSVUUpCmBgYAoKCgo=